package org.dei.perla.sys.query.llqruntime.datastructures;

import java.util.ArrayList;

import org.dei.perla.parser.clauses.OnUnsupportedSampleRateOptions;
import org.dei.perla.parser.clauses.RefreshClause;


/**
 * Questa classe rappresenta tutte le informazioni sul sampling (TABELLA, REFRESH, UNSUPPORTEDSAMPLERATE, etc)
 * @author Camplani, Fortunato, Marelli, Rota et al.
 */
public class SamplingData {

	/**
	 * ArrayList contenente i singoli record della tabella
	 */
	private ArrayList<FrequencyRecord> pRecords;
	
	/**
	 * Comportamento da tenere nel caso in cui il dispositivo non supporta una certa velocita' di campionamento
	 */
	private OnUnsupportedSampleRateOptions pBehaviour;
	
	/**
	 * Campo per la clausola REFRESH	
	 */
	private RefreshClause pRefreshClause;
	
	
	/**
	 * Costruttore della tabella, inizializzandola con già un insieme di record. Di tale insieme vengono tenuti
	 * solo i record validi (ovvero quelli che sono corretti). Se l'insieme è vuoto si ricade nel costruttore banale
	 * @param parArrayList l'insieme di record
	 */
	public SamplingData(ArrayList<FrequencyRecord> parArrayList, OnUnsupportedSampleRateOptions parBehaviour, RefreshClause parRefresh) {
		
		this.pBehaviour = parBehaviour;
		this.pRefreshClause = parRefresh;
		pRecords = new ArrayList<FrequencyRecord>();
		
		if (parArrayList == null) return; //anche se io lancerei l'eccezione data l'importanza;		
		
		for (FrequencyRecord tRecord : parArrayList) {
			
			if (checkRecord(tRecord)) {
				
				this.pRecords.add(tRecord);
			}			
		}
	}
	
	/**
	 * @return Il comportamento in caso di frequenza non supportata dalla FPC
	 */
	public OnUnsupportedSampleRateOptions getBehaviour() {
		
		return this.pBehaviour;
	}
	
	/**
	 * Metodo helper privato per il controllo della validità di un record
	 * @param parRecordToCheck il record da controllare
	 * @return true se è valido, false altrimenti
	 */
	private boolean checkRecord(FrequencyRecord parRecordToCheck) {
		
		//TODO Eccezione
		
		if (parRecordToCheck.getFrequency().getValue()>=0) {
			
			return true;
			
		} else {
			
			System.out.println("*** Record non inserito in tabella (Errore nella frequenza:): "+parRecordToCheck.toString()+" ***\n");
			return false;
		}
	}
	
	/**
	 * @return la clausola REFRESH per questo sampling
	 */
	public RefreshClause getRefreshClause() {
		return this.pRefreshClause;
	}
	
	/**
	 * Ritorna una copia (per sicurezza) del contenuto della tabella
	 */
	public ArrayList<FrequencyRecord> getSamplingTableContent() {	
		return this.pRecords;	
	}
	
	
	/**
	 * Metodo per stampare a video il contenuto della tabella
	 */
	public String toString() {
		
		String tString = new String();
		
		for (FrequencyRecord tRecord : pRecords) {
			
			tString += tRecord.getFirstOperand().toString()+"|"+
						tRecord.getFrequency().toString()+"\n";
			
		}
		
		return tString;
				
	}
	
}

